home *** CD-ROM | disk | FTP | other *** search
- /*
- * Sequence abstract class for Linked objects
- *
- * Copyright © John Wainwright 1988
- *
- * Superclasses:
- *
- * Purpose:
- * To provide a class which will wrap-up a linked object (one that
- * responds to head, tail, etc) and provide the general sequencing
- * operations over it.
- *
- * methods:
- * start ls l - initialises a new sequence object
- * next ls - get next element in the linked object, or END.
- * moreInSeq ls - return true if the seq is not exhausted
- * restart ls - restarts the sequence
- */
-
- #include "oic.h"
- #include "generics.h"
-
- class Linkseq;
-
- struct seq_i
- {
- object ls_source; /* the original source object */
- object ls_rest; /* current tail of source */
- };
- typedef struct seq_i seq_i;
-
- /* ------------------------- Instance methods ---------------------------- */
-
- static object
- _start(self, seq, source)
- object self;
- register seq_i *seq;
- register object *source;
- {
- seq->ls_source = seq->ls_rest = *source;
- return self;
- }
-
- static object
- _next(self, seq)
- object self;
- register seq_i *seq;
- {
- register object item;
-
- item = head(seq->ls_rest);
- seq->ls_rest = tail(seq->ls_rest);
- if (item == END)
- dispose(self);
- return item;
- }
-
- static int
- _moreInSeq(self, seq)
- object self;
- register seq_i *seq;
- {
- return ! (int)isEmpty(seq->ls_rest);
- }
-
- static object
- _restart(self, seq)
- object self;
- register seq_i *seq;
- {
- seq->ls_rest = seq->ls_source;
- return self;
- }
-
- static
- _dispose(self)
- object self;
- {
- free(self);
- }
-
- /* ------------------- Init the Linkseq class ------------------------------- */
-
- _InitLinkseq()
- {
- Linkseq = NewClass(sizeof(seq_i), 0, "Linkseq", END);
- AddMethods(Linkseq,
- startGeneric, _start,
- nextGeneric, _next,
- moreInSeqGeneric, _moreInSeq,
- restartGeneric, _restart,
- disposeGeneric, _dispose,
- deepDisposeGeneric, _dispose,
- END);
- }
-
-